/*
@描述信息: 常用工具函数封装
    1、get_type        判断数类型
    2、format_number   将整数或者带有小数的数字，以逗号分隔
    3、padWithZero     个位数补前置0变成
    4、segmentToTime   时间片转时间 24 小时分为 48 片, 不作开始结束，是否场地票的计算，调用方计算
    5、m2front         钱币从后端到前端时除以100，数据库里存的是分
    6、m2frontFixed    和m2front基本一致，但是返回的是toFixed之后的字符串
    7、m2back          钱币从前端到后端时乘以100
    9、check_file_url  获取文件后缀名(获取文件类型)
    10、debounce       防抖
    11、throttle       节流
    12、encryptReg     数据脱敏
    13、distance       计算两个经纬度之间的距离（单位米）
    14、adaptation     适配屏幕
    15、jump           页面跳转方法封装,已挂载至全局，this.$jump({path:'',params:'',type:'',delta: 1})
 */

// 判断数类型
export const get_type = dataOrigin => {
  return Object.prototype.toString
    .call(dataOrigin)
    .slice(8, -1)
    .toLocaleLowerCase()
}

//将整数或者带有小数的数字，以逗号分隔
export const format_number = str => {
  str += '' //数字转换为字符
  let x = str.split('.') //按照小数点分隔
  let x1 = x[0] //整数部分
  let x2 = x.length > 1 ? '.' + x[1] : '' //小数部分
  var rgx = /(\d+)(\d{3})/ //正则式定义
  while (rgx.test(x1)) {
    //正则式匹配
    x1 = x1.replace(rgx, '$1' + ',' + '$2') //正则式替换
  }
  return x1 + x2
}

//个位数补前置0变成
export const padWithZero = (num, { len = 2 } = {}) => {
  if (typeof num != 'number') throw '请传入一个数值类型'
  return `${num}`.padStart(len, '0')
}

// 时间片转时间 24 小时分为 48 片, 不作开始结束，是否场地票的计算，调用方计算
export const segmentToTime = seg => {
  if (typeof seg != 'number') throw '请传入一个数值类型'
  const hour = padWithZero(Math.floor(seg / 2))
  const minute = seg & 1 ? '30' : '00' // 奇数&1是1，偶数&1是0
  return `${hour}:${minute}`
}

// 钱币从后端到前端时除以100，数据库里存的是分
export const m2front = money => {
  return money === '' || typeof money === 'undefined' ? '' : parseFloat((money / 100).toFixed(2))
}

// 和m2front基本一致，但是返回的是toFixed之后的字符串
export const m2frontFixed = (money, precision = 2) => {
  return money === '' || typeof money === 'undefined' ? '' : (money / 100).toFixed(precision)
}

// 钱币从前端到后端时乘以100
export const m2back = money => {
  return money === '' || typeof money === 'undefined' ? '' : Math.round(money * 100)
}

/**
 * @description       获取文件后缀名(获取文件类型)
 * @param fileName    为文件路径
 * 文件类型包括：图片image、音频audio、视频vedio、word、excel、ppt、txt文本、pdf、压缩文件zip、wps文字wpsword、wps表格wpsexcel、wps演示wpsppt
 */
export const check_file_url = fileName => {
  let EXT = fileName.substr(fileName.lastIndexOf('.') + 1)
  let ext = EXT.toLocaleLowerCase()
  //image
  let imageArr = [
    'art',
    'jps',
    'jut',
    'flo',
    'fpx',
    'ico',
    'g3',
    'mcf',
    'pct',
    'svf',
    'wbmp',
    'rgb',
    'rf',
    'ras',
    'rast',
    'qif',
    'qti',
    'qtif',
    'pgm',
    'pgm',
    'pbm',
    'pnm',
    'ppm',
    'rp',
    'turbot',
    'x-png',
    'xwd',
    'nif',
    'niff',
    'pic',
    'pict',
    'bmp',
    'gif',
    'png',
    'xbm',
    'xpm',
    'ief',
    'iefs',
    'tif',
    'tiff',
    'jfif',
    'jfif-tbnl',
    'jpe',
    'jpeg',
    'jpg',
    'dwg',
    'dxf',
    'xif',
    'nap',
    'naplps'
  ]
  //audio
  let audioArr = [
    'amr',
    'aif',
    'aifc',
    'aiff',
    'ra',
    'qcp',
    'rm',
    'rmm',
    'rmp',
    'rmi',
    'rpm',
    'sid',
    'snd',
    'au',
    'funk',
    'my',
    'jam',
    'kar',
    'mid',
    'midi',
    'la',
    'mjf',
    'lam',
    'm2a',
    'mp2',
    'mp3',
    'm3u',
    'it',
    'mod',
    's3m',
    'voc',
    'wav',
    'gsd',
    'gsm',
    'vox',
    'vqe',
    'vqf'
  ]
  //vedio
  let vedioArr = [
    'afi',
    'mjpg',
    'vos',
    'qt',
    'qtc',
    'scm',
    'mv',
    'm1v',
    'm2v',
    'mpe',
    'mpeg',
    'mpg',
    'mpga',
    'viv',
    'vivo',
    'moov',
    'mov',
    'movie',
    'mv',
    'isu',
    'fmf',
    'dif',
    'dv',
    'avi',
    'dl',
    'fli',
    'gl',
    'vdo',
    'avs',
    'asf',
    'asx',
    'mp4'
  ]
  //word
  let wordArr = ['wps', 'wpt', 'doc', 'docx', 'dot', 'dotx', 'rtf']
  //excel
  let excelArr = ['et', 'ett', 'xls', 'xlsx', 'xlt', 'xltx', 'csv', 'xls', 'xlsx', 'xlsm', 'xltx', 'xltm', 'xlsb', 'xlam', 'xml', 'xla', 'xlw', 'xlr']
  //ppt
  let pptArr = ['dps', 'dpt', 'ppt', 'pptx', 'pot', 'potx', 'potm', 'ppsx', 'ppsm', 'ppam']
  //txt
  let txtArr = ['prn', 'txt', 'dif', 'slk', 'prn', 'prn']
  //pdf
  let pdfArr = ['pdf']
  //zip
  let zipArr = ['rar', 'zip', 'arj', 'z', '7z', 'cab', 'gz', 'lzh', 'ace', 'uue', 'bz2', 'jar', 'iso']
  if (imageArr.includes(ext)) return 'image'
  if (audioArr.includes(ext)) return 'audio'
  if (vedioArr.includes(ext)) return 'vedio'
  if (wordArr.includes(ext)) return 'word'
  if (excelArr.includes(ext)) return 'excel'
  if (pptArr.includes(ext)) return 'ppt'
  if (txtArr.includes(ext)) return 'txt'
  if (pdfArr.includes(ext)) return 'pdf'
  if (zipArr.includes(ext)) return 'zip'
  return ''
}

/**
 * @description   防抖
 * @param delay   延迟的毫秒数
 * @param fn      需要延迟的函数
 *
 */
export const debounce = (delay, fn) => {
  let timer = null
  return function() {
    let self = this,
      args = arguments
    timer && clearTimeout(timer)
    timer = setTimeout(function() {
      fn.apply(self, args)
    }, delay)
  }
}

/**
 * @description   节流
 * @param delay   延迟的毫秒数
 * @param fn      需要延迟的函数
 *
 */
export const throttle = (delay, fn) => {
  let timer = null
  return function() {
    const self = this,
      args = arguments
    if (!timer) {
      timer = setTimeout(function() {
        clearTimeout(timer)
        fn.apply(self, args)
      }, delay)
    }
  }
}

// 数据脱敏（案例：'13456789876'.replace(encryptReg(), '$1****$2')         ==> "134****9876"）
export const encryptReg = (before = 3, after = 4) => {
  return new RegExp('(\\d{' + before + '})\\d*(\\d{' + after + '})')
}

// 计算两个经纬度之间的距离（单位米，保留两位小数）
export const distance = (la1, lo1, la2, lo2) => {
  var La1 = (la1 * Math.PI) / 180.0
  var La2 = (la2 * Math.PI) / 180.0
  var La3 = La1 - La2
  var Lb3 = (lo1 * Math.PI) / 180.0 - (lo2 * Math.PI) / 180.0
  var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(La3 / 2), 2) + Math.cos(La1) * Math.cos(La2) * Math.pow(Math.sin(Lb3 / 2), 2)))
  s = s * 6378.137 //地球半径
  s = ((Math.round(s * 10000) / 10000) * 1000).toFixed(2)
  return s
}

// 适配屏幕
export const adaptation = () => {
  //一般屏幕的标准是375，我们用机型的宽度除以375就是他们的比例了，画图的时候尺寸直接乘以比例就可以适配了哦。
  return uni.getSystemInfoSync().windowWidth / 375
}

/*
跳转方法封装
  path:     跳转路径  （必传）
  params:   携带的参数（要么不传，要么必须是一个对象！）
  type:     跳转的类型,默认为'navigateTo'
  delta:    当跳转类型为'navigateBack'时，返回几层，默认返回上一层页面

  注意：在上一个页面接收传递的参数不是一个空对象，在下一个页面请使用以下方法接收参数
        onLoad(options){
          const obj = JSON.parse(decodeURIComponent(options.params));
          console.log('接收上一个页面传递过来的数据-----',obj);
        },
*/

export const jump = ({ path, params, type = 'navigateTo', delta = 1 }) => {
  if (!path) throw '请填写跳转路径'
  console.log('9999点击跳转',type)
  let types = ['switchTab', 'navigateBack', 'navigateTo', 'redirectTo', 'reLaunch']
  if (types.indexOf(type) === -1) throw '请输入正确的的跳转类型，具体请参考: https://uniapp.dcloud.io/api/router?id=navigateto'
  if (type === types[0]) {
    uni.switchTab({ url: path })
    return
  }
  if (type == types[1]) {
    uni.navigateBack({ delta })
    return
  }
  if (type == types[2]) {
    uni.navigateTo({ url: path })
    return
  }
  if (!params) {
    uni[type]({ url: path })
    return
  }
  if (get_type(params) !== 'object') throw '传递的参数必须是一个对象！'
  params = encodeURIComponent(JSON.stringify(params))
  uni[type]({
    url: `${path}?params=${params}`
  })
}
